# 先修改爆红数据,在更改动态数据

# 封装公共断言的方法   self 转化为参数testCase   response响应体
import json
import app


def common_assert(testCase, response, exp_status_code, exp_success, exp_code, exp_message):
    # 从响应数据中获取字典类型的响应数据
    res_dict = response.json()

    # 断言
    # 断言状态码   self=testCase   res=response
    testCase.assertEqual(exp_status_code, response.status_code)
    # 断言响应体的数据
    # 断言success
    testCase.assertEqual(exp_success, res_dict.get("success"))
    # 断言code
    testCase.assertEqual(exp_code, res_dict.get("code"))
    # 断言message
    testCase.assertIn(exp_message, res_dict.get("message"))


import pymysql


class DBUtil:
    __conn = None
    __cur = None

    @classmethod
    def __get_connect(cls):
        if cls.__conn is None:
            cls.__conn = pymysql.connect(host="211.103.136.244",
                                         user="student",
                                         password="iHRM_student_2021",
                                         database="ihrm",
                                         port=7061, )
        return cls.__conn

    @classmethod
    def __get_cursor(cls):
        if cls.__cur is None:
            cls.__cur = cls.__get_connect().cursor()
        return cls.__cur

    @classmethod
    def exe_sql(cls, sql_str):
        try:
            # 获取游标对象
            cursor = cls.__get_cursor()
            # 游标对象中执行sql语句
            cursor.execute(sql_str)
            # 如果是查询的SQL语句
            if sql_str.split(" ")[0].lower() == "select":
                # 获取全部的处查询结果
                return cursor.fetchall()
            # 如果是非查询的SQL语句
            else:
                # 手动提交数据库事务
                cls.__get_connect().commit()
                # 返回受影响的行数
                return "受影响的{}行".format(cursor.rowcount)
        except Exception as e:
            # 数据库事务回滚
            print(e)
            cls.__get_connect().rollback()
        # 关闭游标对象
        finally:
            cls.__close_cursor()
            # 关闭数据库连接对象
            cls.__close_connect()

    @classmethod
    def __close_cursor(cls):
        if cls.__cur is not None:
            cls.__cur.close()
            cls.__cur = None

    @classmethod
    def __close_connect(cls):
        if cls.__conn is not None:
            cls.__conn.close()
            cls.__conn = None

    # 读取外部文件的测试数据


def read_json(filename):
    # 获取外部文件的路径
    file_path = app.BASE_PATH + "/data/" + filename + ".json"
    # 获取原始的外部文件中的测试数据
    with open(file_path, encoding="utf-8")as f:
        # 讲测试数据进行解析,结果为列表嵌套字典
        data = json.load(f)
        print(data)

    # 讲测试数据测试转化为列表嵌套元祖,并且进行返回
    # 定义一个新的列表,用来接收列表嵌套元祖的测试数据
    data_list = list()
    # 对原有的测试数据,进行循环遍历
    for data_dict in data:
        # 获取每一个的字典,使用values方法,获取字典中的values值(数据累死=列表)
        data1 = data_dict.values()
        print("字典中values的值:", data1)
        # 将列表中字典的values值,  强转为元祖(tuple(data1)    并且添加到新的列表中
        data_list.append(tuple(data1))
        print("列表嵌套元祖的测试数据:", data_list)
        # 返回列表嵌套元祖的测试数据
    return data_list


if __name__ == '__main__':
    read_json("login_case_data")
